/*
 * @Author: szx
 * @Date: 2022-03-30 12:52:52
 * @LastEditTime: 2022-03-30 13:11:39
 * @Description:
 * @FilePath: \leetcode\1600-1699\1606\1606.js
 */
/**
 * @param {number} k
 * @param {number[]} arrival
 * @param {number[]} load
 * @return {number[]}
 */
/**
 * @param {number} k
 * @param {number[]} arrival
 * @param {number[]} load
 * @return {number[]}
 */
 var busiestServers = function (k, arrival, load) {
    // 统计服务器执行任务数量
    const taskCounts = Array(k).fill(0);
    // 记录服务器当前任务执行到哪一个时间点
    const serversTimestamp = Array(k).fill(0);
    // 记录当前执行了任务最多的服务器的任务次数
    // 搜索当前哪台服务器空闲函数
    const findFreeServer = (time, i) => {
        // 如果第 (i % k) 个服务器空闲，那么对应服务器会处理该请求
        let j = i % k;
        if (serversTimestamp[j] <= time) return j;
        // 找一圈
        for (let l = j + 1; l < j + k + 1; l++) {
            if (serversTimestamp[l % k] <= time) return l % k;
        }
        return -1;
    };
    arrival.forEach((time, i) => {
        // 找到空闲服务器
        let serverIndex = findFreeServer(time, i);
        // 全都没空，任务抛弃
        if (serverIndex === -1) return;
        // 对应服务器执行任务次数累加并判断是不是最多的记录到max字段
        taskCounts[serverIndex]++;
        // 记录当前服务器的时间戳
        serversTimestamp[serverIndex] = time + load[i];
    });
    // 找到处理任务最多的服务器
    let max = Math.max(...taskCounts);
    let res = [];
    for (let i = 0; i < k; ++i) {
        if (taskCounts[i] === max) res.push(i);
    }
    return res;
};
